<?php
class GeneratorSimple extends Generator
{
    /**
     * @param  $mode Режим генерации
     */
    public function __construct($mode)
    {
        $this->LoadSettings($mode);

        $this->IconsList = $this->GetIcons();

        // Устанавливаем высоту и ширину картинки в иконках

        $this->RowsCount = round($this->GetIconsCount() / $this->ColsCount);

        $this->GetLogo();

        // Устанавливаем высоту и ширину картинки в пикселях
        $this->MapWidth = ($this->IconSize
                + $this->LabelWidth
                + $this->VerticalSpace
        ) * $this->ColsCount
                + 2 * $this->BorderWidth;

        $this->MapHeight = $this->HeaderFontSize
                + 3 * $this->VerticalSpace
                + ($this->IconSize
                        + $this->HorisontalSpace
                ) * $this->RowsCount
                + 2 * $this->VerticalSpace
                + $this->Logo['height']
                + 2 * $this->BorderWidth; // Рамка
    }

    protected function LoadSettings($mode)
    {
        parent::LoadSettings($mode);
    }

    protected function Generate()
    {
        $map = self::CreateAlphaPng($this->MapWidth, $this->MapHeight);

        $labelColor1 = imagecolorallocate($map,
            $this->LabelColor1['red'],
            $this->LabelColor1['green'],
            $this->LabelColor1['blue']);

        $labelColor2 = imagecolorallocate($map,
            $this->LabelColor2['red'],
            $this->LabelColor2['green'],
            $this->LabelColor2['blue']);

        $xCount = $this->Mode === 'ByCols' ? $this->ColsCount : $this->RowsCount;
        $yCount = $this->Mode === 'ByCols' ? $this->RowsCount : $this->ColsCount;

        for ($x = 0; $x < $xCount; $x += 1)
        {
            for ($y = 0; $y < $yCount; $y += 1)
            {
                $key = key($this->IconsList);
                $icon = $this->IconsList[$key];

                $xCoord = $this->Mode === 'ByCols' ? $x : $y;
                $yCoord = $this->Mode === 'ByCols' ? $y : $x;

                // Рассчитываем координаты места вставки иконки
                $icon_x = $this->BorderWidth
                        + $xCoord * ($this->IconSize
                                + $this->LabelWidth
                                + $this->VerticalSpace);

                $icon_y = $this->BorderWidth
                        + $this->HeaderFontSize
                        + 3 * $this->VerticalSpace
                        + $yCoord * ($this->IconSize + $this->HorisontalSpace);

                // добавляем иконку
                imagecopy($map, $icon->Image,
                    $icon_x, $icon_y, // Координаты куда вставлять
                    0, 0, // Координаты начала вставляемой области внутри иконки
                    $this->IconSize, $this->IconSize); // Координаты конца вставляемой области внутри иконки


                // Текст метки (обрезанный, если длинный)
                $label = self::GetLimitedLabel($icon->Name,
                    $this->Font,
                    $this->FontSize,
                        $this->LabelWidth - $this->VerticalSpace * 4);

                // Для новой иконки рисуем на фоне рамку
                if ($icon->New && !$icon->Metaphor) {
                    $this->SetFrameForLabel($map, $label, $icon_x, $icon_y, $this->IconSize, $this->IconSize, 0);
                }
                if ($icon->Metaphor) {
                    $this->SetFrameForLabel($map, $label, $icon_x, $icon_y, $this->IconSize, $this->IconSize, 1);
                }
                // Добавляем саму надпись
                $this->SetLabel($map, $label, $labelColor1, $labelColor2,
                    $icon_x, $icon_y, $this->IconSize, $this->IconSize);

                // Переключаем указатель на следующий элемент
                next($this->IconsList);
            }
        }

        // Заголовок
        $this->SetHeader($map, $labelColor1);

        // Строка с копирайтом
        $this->SetCopyrightAndLogo($map, $labelColor1);

        imagesavealpha($map, true);
        return $map;
    }


}